package com.yaya.generator.controller;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.yaya.common.param.RequestParam;
import com.yaya.common.result.ResponseResult;
import com.yaya.generator.config.DataSourceConfig;
import com.yaya.generator.config.GlobalConfig;
import com.yaya.generator.config.PackageConfig;
import com.yaya.generator.dtomain.GeneratorDto;
import com.yaya.generator.engine.FreemarkerTemplateEngine;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * 代码生成器控制器
 *
 */
@RestController
@RequestMapping("generator")
public class GeneratorController {


  @PostMapping("parameter")
  public ResponseResult parameter() {
    return ResponseResult.success().put("parameter", GeneratorDto.getParameter());
  }

  @PostMapping("execute")
  public ResponseResult generator(@RequestBody RequestParam<GeneratorDto> param) {
    try {
      param.getData().setParameter();
      // 数据源配置
      FastAutoGenerator.create(DataSourceConfig.builder())
          // 全局配置
          .globalConfig(builder -> {
            GlobalConfig.build(builder);
          })
          // 包配置
          .packageConfig(builder -> {
            PackageConfig.build(builder);
          })
          // 注入配置
          .injectionConfig(builder -> {
            // 默认对象
            // builder.beforeOutputFile((tableInfo, objectMap) -> {
            // });
            // 自定义对象
            // builder.customMap(customMap);
            // 自定义文件
            Map<String, String> customFile = new HashMap<String, String>();
            customFile.put("dto", "/templates/dto.java.ftl");
//            customFile.put("admin-api", "/templates/admin-api.ts.ftl");
//            customFile.put("admin-view", "/templates/admin-view.vue.ftl");
            builder.customFile(customFile);
          })
          // 策略配置
          .strategyConfig(builder -> {
            // 启用大写命名
            // builder.enableCapitalMode();
            // 启用跳过视图
            // builder.enableSkipView();
            // 禁用SQL过滤
            // builder.disableSqlFilter();
            // 启用模式
//            builder.enableSchema();
            // 模糊表匹配（SQL过滤）
            // builder.likeTable(null);
            // 模糊表排除（SQL过滤）
            // builder.notLikeTable(null);
            // 精确表匹配（内存过滤）
            builder.addInclude(PackageConfig.TABLE_NAMES);
            // 精确表排除（内存过滤）
            // builder.addExclude(null);
            // 过滤表前缀
            // builder.addTablePrefix(null);
            // 过滤表后缀
            // builder.addTableSuffix(null);
            // 过滤字段前缀
            // builder.addFieldPrefix(null);
            // 过滤字段后缀
            // builder.addFieldSuffix(null);
            // 实体策略配置-父类公共字段
            builder.entityBuilder().addSuperEntityColumns("order_number", "insert_user", "update_user", "delete_user",
                "insert_time", "update_time", "delete_time", "is_delete");
          })
          // 模板引擎配置
          .templateEngine(new FreemarkerTemplateEngine())
          // 执行
          .execute();
      return ResponseResult.success();
    } catch (Exception e) {
      e.printStackTrace();
      return ResponseResult.error();
    }
  }

}
